package org.edu.common.base;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springframework.transaction.annotation.Transactional;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.function.Function;

/**
 * service-基础类
 */
public interface BaseService<T> {

    void importExcel(List<Map<String, Object>> mapList);
    /**
     * 新增，不处理数据
     *
     * @param entity 实体
     * @author zb
     * @since 2019-10-12
     */
    void insert(T entity);

    /**
     * 新增-批量，不处理数据
     *
     * @param list 列表
     * @author zb
     * @since 2019-10-12
     */
    @Transactional
    void insert(Collection<? extends T> list);

    /**
     * 更新，不处理数据
     *
     * @param entity 实体
     * @author zb
     * @since 2019-10-12
     */
    void update(T entity);

    /**
     * 更新，不处理数据
     *
     * @author zb
     * @since 2019-10-12
     */
    void update(Wrapper wrapper);

    /**
     * 更新-批量，不处理数据
     *
     * @param list 列表
     * @author zb
     * @since 2019-10-12
     */
    @Transactional
    void update(Collection<? extends T> list);

    /**
     * 保存，执行前会调用beforeSave
     *
     * @param entity 实体
     * @author zb
     * @since 2019-10-12
     */
    @Transactional
    void save(T entity);

    /**
     * 删除
     *
     * @param id id
     * @return 是否删除
     * @author zb
     * @since 2019-10-12
     */
    boolean delete(final String id);

    /**
     * 删除-批量
     *
     * @param ids ids
     * @return 删除数量
     * @author zb
     * @since 2019-10-12
     */
    int delete(Collection<String> ids);

    /**
     * 获取一条记录
     *
     * @param id id
     * @return 实体
     * @author zb
     * @since 2019-10-12
     */
    T findById(final String id);

    /**
     * 获取一条记录，并转换成相应对象
     *
     * @param id     id
     * @param rClass 目标类
     * @return 目标对象
     */
    <R> R findById(final String id, Class<R> rClass);

    /**
     * 查询-所有数据
     *
     * @return list
     * @author zb
     * @since 2019-10-12
     */
    List<T> findAll();

    /**
     * 分页
     *
     * @param page         分页
     * @param queryWrapper 查询对象
     * @return IPage
     * @author zb
     * @since 2019-10-12
     */
    @Transactional(readOnly = true)
    IPage page(BasePageDto page, Wrapper<T> queryWrapper);

    /**
     * 分页-自定义返回类转换
     *
     * @param page          分页
     * @param queryWrapper  查询对象
     * @param convertMapper 转换方法
     * @param <R>
     * @return
     * @author zb
     * @since 2020-06-08
     */
    @Transactional(readOnly = true)
    <R> IPage<R> page(BasePageDto page, Wrapper<T> queryWrapper, Function<T, R> convertMapper);

    /**
     * 描述 列表
     *
     * @param
     * @return
     * @author zb
     * @created 2020/6/1 11:18 AM
     */
    @Transactional(readOnly = true)
    List<T> listByWrapper(Wrapper<T> wrapper);
}
